/* * -------------------------------------------------------------- * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * -------------------------------------------------------------- * * (c) 2006 by Tomo Krajina, aaa@puzz.info * */ package info.puzz.trackprofiler.gui; import com.cloudgarden.layout.AnchorConstraint; import com.cloudgarden.layout.AnchorLayout; import info.puzz.trackprofiler.Messages; import info.puzz.trackprofiler.TrackProfilerAppContext; import info.puzz.trackprofiler.TrackProfilerException; import info.puzz.trackprofiler.appobjects.Track; import info.puzz.trackprofiler.appobjects.TrackExtreeme; import info.puzz.trackprofiler.appobjects.TrackLoader; import info.puzz.trackprofiler.appobjects.TrackPoint; import info.puzz.trackprofiler.appobjects.Waypoint; import info.puzz.trackprofiler.appobjects.Waypoints; import info.puzz.trackprofiler.util.Message; import info.puzz.trackprofiler.util.TrackFileFilter; import info.puzz.trackprofiler.util.TrackProfilerMath; import java.awt.BasicStroke; import java.awt.BorderLayout; import java.awt.Color; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.util.Vector; import javax.swing.BorderFactory; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFileChooser; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.JTextField; import javax.swing.JToolBar; import javax.swing.SwingConstants; import javax.swing.WindowConstants; import org.jfree.chart.ChartFactory; import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; import org.jfree.chart.annotations.XYPointerAnnotation; import org.jfree.chart.plot.PlotOrientation; import org.jfree.chart.plot.ValueMarker; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.XYAreaRenderer; import org.jfree.data.xy.AbstractXYDataset; import org.jfree.data.xy.XYSeries; import org.jfree.data.xy.XYSeriesCollection; import org.jfree.ui.LengthAdjustmentType; import org.jfree.ui.RectangleAnchor; import org.jfree.ui.RectangleInsets; import org.jfree.ui.TextAnchor; /** * This code was generated using CloudGarden's Jigloo SWT/Swing GUI Builder, * which is free for non-commercial use. If Jigloo is being used commercially * (ie, by a corporation, company or business for any purpose whatever) then you * should purchase a license for each developer using Jigloo. Please visit * www.cloudgarden.com for details. Use of Jigloo implies acceptance of these * licensing terms. ************************************* A COMMERCIAL LICENSE * HAS NOT BEEN PURCHASED for this machine, so Jigloo or this code cannot be * used legally for any corporate or commercial purpose. * ************************************* */ public class TrackProfilerFrame extends javax.swing.JFrame { private static final String PLT_EXTENSION = "plt"; //$NON-NLS-1$ private static final String WPT_EXTENSION = "wpt"; //$NON-NLS-1$ private JPanel jPanel1; private JToolBar topToolBar; private JButton aboutButton; private JTable trackTable; private JScrollPane jScrollPane1; private JButton waypointsButton; private JButton preferencesButton; private JPanel jPanel3; private JButton exitButton; private JTextField length2DField; private JTextField length3DField; private JTextField downhillField; private JTextField climbingSumField; private JLabel length3dLabel; private JLabel length2dLabel; private JLabel downhillSumLabel; private JLabel climbingSumLabel; private JTextField lowPointField; private JLabel lowPointLabel; private JTextField hiPointField; private JLabel hiPointLabel; private JButton extreemesButton; private JButton izravnajButton; private JButton resetButton; private JButton loadFiles; private JPanel jPanel2; private ChartPanel chartPanel; private Track track; /** Ovdje se cuva pocetni track (u slucaju reseta vraca se na njega. */ private File trackFile; /** Waypoints file. */ private File waypointsFile; private boolean showExtreemes = false; private static TrackProfilerFrame _instance = null; /** * Ovdje se cuva direktorij s kojim se je zadnji put pristupilo kod * ucitavanja track-a. */ private File folderWithTracks = null; /** Redni broj tocke koja je trenutno oznacena. */ // private int selectedPoint = -1; /** Pocetna odabrana tocka u tablici s tockama track-a. */ private int startSelectedPoints = -1; /** Krajnja odabrana tocka. @see #startSelectedPoints */ private int endSelectedPoints = -1; public static void main( String[] args ) { TrackProfilerFrame inst = new TrackProfilerFrame(); inst.setVisible( true ); } private TrackProfilerFrame() { super(); initGUI(); } public static TrackProfilerFrame getInstance() { if ( _instance == null ) { _instance = new TrackProfilerFrame(); } return _instance; } private void initGUI() { try { BorderLayout thisLayout = new BorderLayout(); this.getContentPane().setLayout( thisLayout ); setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE ); this.setTitle( "Track Profiler " + TrackProfilerAppContext.PROGRAM_VERSION ); //$NON-NLS-1$//$NON-NLS-2$ this.addWindowListener( new WindowAdapter() { public void windowClosing( WindowEvent evt ) { rootWindowClosing( evt ); } } ); this.getContentPane().add( getJPanel1(), BorderLayout.CENTER ); this.getContentPane().add( getTopToolBar(), BorderLayout.NORTH ); this.getContentPane().add( getJPanel2(), BorderLayout.EAST ); this.setLocation( new java.awt.Point( 100, 100 ) ); pack(); this.setSize( 794, 537 ); } catch ( Exception e ) { e.printStackTrace(); } } private JPanel getJPanel1() { if ( jPanel1 == null ) { jPanel1 = new JPanel(); BorderLayout jPanel1Layout = new BorderLayout(); jPanel1.setLayout( jPanel1Layout ); jPanel1.setBorder( BorderFactory.createTitledBorder( "" ) ); //$NON-NLS-1$ jPanel1.add( getChartPanel() ); } return jPanel1; } private JPanel getJPanel2() { if ( jPanel2 == null ) { jPanel2 = new JPanel(); AnchorLayout jPanel2Layout = new AnchorLayout(); jPanel2.setLayout(jPanel2Layout); jPanel2.setPreferredSize( new java.awt.Dimension( 200, 230 ) ); jPanel2.add(getJPanel3(), new AnchorConstraint(10,10, 415, 10, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_NONE, AnchorConstraint.ANCHOR_ABS)); jPanel2.add(getJScrollPane1(), new AnchorConstraint(200,10, 11, 10, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS, AnchorConstraint.ANCHOR_ABS)); } return jPanel2; } public void setTrack( Track track ) throws TrackProfilerException { this.track = track; this.getTrackTable().setModel( new TrackTableModel( this ) ); if ( track == null ) { this.resetTrackInfo(); } else { drawChart(); } } protected Track getTrack() { return this.track; } private void computeTrackInfo() throws TrackProfilerException { if ( this.track == null ) { throw new TrackProfilerException( new Message( Messages.TRACK_NOT_LOADED ).toString() ); } double length2d = this.track.getTrack2DLength(); double length3d = this.track.getTrack3DLength(); TrackPoint lowest = this.track.getLowestPoint(); TrackPoint highest = this.track.getHighestPoint(); double[] upDown = this.track.getClimbingAndDownhillSum(); this.getLength2DField().setText( "" + TrackProfilerMath.round( length2d, 1 ) ); //$NON-NLS-1$ this.getLength3DField().setText( "" + TrackProfilerMath.round( length3d, 1 ) ); //$NON-NLS-1$ this.getLowPointField() .setText( "" + TrackProfilerMath.round( lowest.getElevation(), 1 ) ); //$NON-NLS-1$ this.getHiPointField().setText( "" + TrackProfilerMath.round( highest.getElevation(), 1 ) ); //$NON-NLS-1$ this.getClimbingSumField().setText( "" + TrackProfilerMath.round( upDown[0], 1 ) ); //$NON-NLS-1$ this.getDownhillField().setText( "" + TrackProfilerMath.round( upDown[1], 1 ) ); //$NON-NLS-1$ } private void resetTrackInfo() { this.getLength2DField().setText( "" ); //$NON-NLS-1$ this.getLength3DField().setText( "" ); //$NON-NLS-1$ this.getLowPointField().setText( "" ); //$NON-NLS-1$ this.getHiPointField().setText( "" ); //$NON-NLS-1$ this.getClimbingSumField().setText( "" ); //$NON-NLS-1$ this.getDownhillField().setText( "" ); //$NON-NLS-1$ this.startSelectedPoints = -1; this.endSelectedPoints = -1; } protected void drawChart() throws TrackProfilerException { if ( this.track == null ) { throw new TrackProfilerException( "track_not_loaded" ); //$NON-NLS-1$ } this.computeTrackInfo(); String name = trackFile != null ? trackFile.getName() : "TrackProfiler"; //$NON-NLS-1$ JFreeChart chart; if ( TrackProfilerAppContext.getInstance().isFilledGraph() ) { chart = ChartFactory .createXYAreaChart( name, new Message( Messages.LENGTH ).toString(), new Message( Messages.ELEVATION ).toString(), this.toDataset(), PlotOrientation.VERTICAL, true, true, false ); } else { chart = ChartFactory .createXYLineChart( name, new Message( Messages.LENGTH ).toString(), new Message( Messages.ELEVATION ).toString(), this.toDataset(), PlotOrientation.VERTICAL, true, true, false ); } chart.setBackgroundPaint( Color.white ); XYPlot xyplot = (XYPlot) chart.getPlot(); XYAreaRenderer xyarearenderer = new XYAreaRenderer(); xyarearenderer.setSeriesPaint(0, new Color(186, 197, 231, 200)); xyplot.setRenderer(0, xyarearenderer); drawSelectedPoints( xyplot ); if ( this.track.getWaypoints().size() > 0 ) { Waypoints markerPoints = new Waypoints(); markerPoints.addAll( this.track.getWaypoints() ); for ( int i = 0; i < this.track.getWaypoints().size(); i++ ) { Waypoint waypoint = (Waypoint) this.track.getWaypoints().get( i ); prepareWaypontOnChart( xyplot, waypoint ); } xyplot.setAxisOffset( new RectangleInsets( 5, 5, 5, 5 ) ); xyplot.getRangeAxis().setUpperMargin( 0.15 ); } if ( showExtreemes ) { Vector/* <TrackExtreeme> */extreemes = this.track.findExtremes(); for ( int i = 0; i < extreemes.size(); i++ ) { Waypoint ex = (Waypoint) extreemes.get( i ); prepareWaypontOnChart( xyplot, ex ); } } getChartPanel().setChart( chart ); getJPanel1().repaint(); } private void drawSelectedPoints( XYPlot xyplot ) { if( this.startSelectedPoints >= 0 ) { _drawSelectedPoint( xyplot, this.startSelectedPoints ); } if( this.endSelectedPoints >= 0 && this.endSelectedPoints != this.startSelectedPoints ) { _drawSelectedPoint( xyplot, this.endSelectedPoints ); } } private void _drawSelectedPoint( XYPlot xyplot, int position ) { TrackPoint point = this.getTrack().getPointAt( position ); // Strelicu crtamo samo ako je samo jedna tocka oznacena: if ( this.startSelectedPoints < 0 || this.endSelectedPoints < 0 || this.startSelectedPoints == this.endSelectedPoints ) { double angle = point.getAngle(); XYPointerAnnotation xypointerannotation = new XYPointerAnnotation( "", point.getPosition(), //$NON-NLS-1$ point.getElevation(), Math.PI - angle ); xypointerannotation.setTipRadius( 3.0D ); xypointerannotation.setBaseRadius( 30 ); xypointerannotation.setTextAnchor( TextAnchor.BASELINE_RIGHT ); xypointerannotation.setFont( GUIConstants.SANS_SERIF_11 ); if( angle > 0 ) { xypointerannotation.setPaint( Color.red ); } else if( angle < 0 ) { xypointerannotation.setPaint( Color.green ); } else { xypointerannotation.setPaint( Color.gray ); } xypointerannotation.setText( ( TrackProfilerMath.round( 100 * angle, 1 ) ) + " %" ); //$NON-NLS-1$ xyplot.addAnnotation( xypointerannotation ); } ValueMarker valuemarker = new ValueMarker( point.getPosition() ); valuemarker.setLabelOffsetType( LengthAdjustmentType.NO_CHANGE ); valuemarker.setStroke( new BasicStroke( 1.0F ) ); if ( this.startSelectedPoints != this.endSelectedPoints && position == this.startSelectedPoints ) { valuemarker.setLabelPaint( Color.blue ); valuemarker.setLabelAnchor( RectangleAnchor.BOTTOM_LEFT ); valuemarker.setLabelTextAnchor( TextAnchor.BOTTOM_LEFT ); // Ispisuje udaljenost i kut: TrackPoint t1 = this.getTrack().getPointAt(this.startSelectedPoints); TrackPoint t2 = this.getTrack().getPointAt(this.endSelectedPoints); double distance3D = TrackProfilerMath.round( t1.getPosition() - t2.getPosition(), 1 ) ; String angle = Math.abs( TrackProfilerMath.round( t1.getAngle( t2 ) * 100, 1 ) ) + "%"; //$NON-NLS-1$ String label = Message.get( Messages.SELECTED_DISTANCE_LABEL ) + distance3D + ", " + Message.get( Messages.SELECTED_ANGLE_LABEL ) + angle; //$NON-NLS-1$ valuemarker.setLabel( " " + label ); //$NON-NLS-1$ valuemarker.setLabelFont( GUIConstants.SANS_SERIF_11 ); } xyplot.addDomainMarker( valuemarker ); } private void prepareWaypontOnChart( XYPlot xyplot, Waypoint waypoint ) { Vector positions = waypoint.getPositionsOnTrack(); for( int i = 0; i < positions.size(); i++ ) { double position = ( (Double) positions.get( i ) ).doubleValue(); double elevation = waypoint.getElevation(); if ( position > 0 && waypoint.isVisible() ) { String waypointLabel; if ( TrackProfilerAppContext.getInstance().isWaypointLabelFromTitle() ) { waypointLabel = waypoint.getTitle(); } else { waypointLabel = waypoint.getDescription(); } double arrowAngle = Math.PI * 1.5; if( waypoint.getArrowLength() < 0 ) { arrowAngle += Math.PI; } XYPointerAnnotation xypointerannotation = new XYPointerAnnotation( waypointLabel, position, elevation, arrowAngle ); xypointerannotation.setTipRadius( 3.0D ); xypointerannotation.setBaseRadius( Math.abs( waypoint.getArrowLength() ) ); xypointerannotation.setFont( GUIConstants.SANS_SERIF_11 ); xypointerannotation.setPaint( Color.blue ); xypointerannotation.setTextAnchor( TextAnchor.BASELINE_CENTER ); xyplot.addAnnotation( xypointerannotation ); ValueMarker valuemarker = new ValueMarker( position ); valuemarker.setLabelOffsetType( LengthAdjustmentType.NO_CHANGE ); valuemarker.setStroke( new BasicStroke( 1.0F ) ); // TODO: u postavke da li ispisivati ovdje if ( false ) { valuemarker.setLabel( waypoint.getTitle() ); } valuemarker.setLabelFont( GUIConstants.SANS_SERIF_11 ); if ( waypoint instanceof TrackExtreeme ) { valuemarker.setPaint( Color.blue ); } else { valuemarker.setPaint( new Color( 220, 220, 220 ) ); } valuemarker.setLabelPaint( Color.red ); valuemarker.setLabelAnchor( RectangleAnchor.BOTTOM_LEFT ); valuemarker.setLabelTextAnchor( TextAnchor.BOTTOM_LEFT ); // xyplot.addRangeMarker(valuemarker); xyplot.addDomainMarker( valuemarker ); } } } public void setWaypoints( Waypoints waypoints ) throws TrackProfilerException { if ( this.track != null ) { this.track.setWaypoints( waypoints ); this.drawChart(); } else { throw new TrackProfilerException( "track_not_loaded" ); //$NON-NLS-1$ } } public ChartPanel getChartPanel() { if ( this.chartPanel == null ) { this.chartPanel = new ChartPanel( null ); this.chartPanel.setPreferredSize( null ); } return this.chartPanel; } private JToolBar getTopToolBar() { if ( topToolBar == null ) { topToolBar = new JToolBar(); topToolBar.setFloatable( false ); topToolBar.add( getLoadFiles() ); topToolBar.add( getResetButton() ); topToolBar.add( getIzravnajButton() ); topToolBar.add( getExtreemesButton() ); topToolBar.add( getWaypointsButton() ); topToolBar.add( getPreferencesButton() ); topToolBar.add(getAboutButton()); topToolBar.add( getExitButton() ); } return topToolBar; } private JButton getLoadFiles() { if ( loadFiles == null ) { loadFiles = new JButton(); loadFiles.setText( new Message( Messages.LOAD ).toString() ); loadFiles.setFont( GUIConstants.DIALOG_12 ); loadFiles .setIcon( new ImageIcon( getClass().getClassLoader().getResource( "info/puzz/trackprofiler/icons/fldr_obj.gif" ) ) ); //$NON-NLS-1$ loadFiles.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { try { loadFilesActionPerformed( evt ); } catch ( TrackProfilerException e ) { TrackProfilerFrame.this.showError( new Message( e.getMessage() ) ); } } } ); } return loadFiles; } private void loadFilesActionPerformed( ActionEvent evt ) throws TrackProfilerException { JFileChooser chooser = null; if ( this.folderWithTracks != null ) { chooser = new JFileChooser( this.folderWithTracks ); } else { chooser = new JFileChooser(); } TrackFileFilter filter = new TrackFileFilter(); filter.addExtension( PLT_EXTENSION ); filter.addExtension( WPT_EXTENSION ); filter.setDescription( new Message( Messages.PLT_AND_WPT_FILES ).toString() ); chooser.setFileFilter( filter ); chooser.setMultiSelectionEnabled( true ); int returnVal = chooser.showOpenDialog( this ); if ( returnVal == JFileChooser.APPROVE_OPTION ) { File[] selectedFiles = chooser.getSelectedFiles(); for ( int i = 0; i < selectedFiles.length; i++ ) { File selectedFile = selectedFiles[i]; this.folderWithTracks = selectedFile.getParentFile(); if ( selectedFile.getName().toLowerCase().endsWith( "." + PLT_EXTENSION ) ) { //$NON-NLS-1$ try { loadTrack( selectedFile ); } catch ( FileNotFoundException e ) { throw new TrackProfilerException( new Message( Messages.ERROR_WHEN_LOADING ).toString() + selectedFile.getName() ); } } } for ( int i = 0; i < selectedFiles.length; i++ ) { File selectedFile = selectedFiles[i]; this.folderWithTracks = selectedFile.getParentFile(); if ( selectedFile.getName().toLowerCase().endsWith( "." + WPT_EXTENSION ) ) { //$NON-NLS-1$ try { loadWaypoints( selectedFile ); } catch ( FileNotFoundException e ) { throw new TrackProfilerException( new Message( Messages.ERROR_WHEN_LOADING ).toString() + selectedFile.getName() ); } } } } } private void loadWaypoints( File selectedFile ) throws FileNotFoundException, TrackProfilerException { this.waypointsFile = selectedFile; FileInputStream in = new FileInputStream( selectedFile ); this.setWaypoints( TrackLoader.loadWaypoints( in ) ); } private void loadTrack( File selectedFile ) throws FileNotFoundException, TrackProfilerException { this.trackFile = selectedFile; FileInputStream in = new FileInputStream( selectedFile ); this.setTrack( TrackLoader.loadTrack( in ) ); } private JButton getResetButton() { if ( resetButton == null ) { resetButton = new JButton(); resetButton.setText( new Message( Messages.RESET ).toString() ); resetButton.setIcon( new ImageIcon( getClass().getClassLoader().getResource( "info/puzz/trackprofiler/icons/undo_edit.gif" ) ) ); //$NON-NLS-1$ resetButton.setFont( GUIConstants.DIALOG_12 ); resetButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { try { resetButtonActionPerformed( evt ); } catch ( TrackProfilerException e ) { TrackProfilerFrame.this.showError( new Message( e.getMessage() ) ); //$NON-NLS-1$ } } } ); } return resetButton; } private void resetButtonActionPerformed( ActionEvent evt ) throws TrackProfilerException { try { if ( this.trackFile == null ) { throw new TrackProfilerException( "track_not_loaded" ); //$NON-NLS-1$ } this.loadTrack( this.trackFile ); if ( this.waypointsFile != null ) { this.loadWaypoints( this.waypointsFile ); } } catch ( TrackProfilerException e ) { throw e; } catch ( FileNotFoundException e ) { throw new TrackProfilerException( "file_not_found!" ); //$NON-NLS-1$ } this.getChartPanel().repaint(); } private JButton getIzravnajButton() { if ( izravnajButton == null ) { izravnajButton = new JButton(); izravnajButton.setText( new Message( Messages.SMOOTH ).toString() ); izravnajButton.setFont( GUIConstants.DIALOG_12 ); izravnajButton.setIcon( new ImageIcon( getClass().getClassLoader() .getResource( "info/puzz/trackprofiler/icons/curve.gif" ) ) ); //$NON-NLS-1$ izravnajButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { try { izravnajButtonActionPerformed( evt ); } catch ( TrackProfilerException e ) { TrackProfilerFrame.this.showError( new Message( e.getMessage() ) ); //$NON-NLS-1$ } } } ); } return izravnajButton; } private void izravnajButtonActionPerformed( ActionEvent evt ) throws TrackProfilerException { if ( this.track == null ) { throw new TrackProfilerException( "track_not_loaded" ); //$NON-NLS-1$ } // 2x: this.track.smoothTrack(); this.track.smoothTrack(); this.drawChart(); this.getTrackTable().setModel( new TrackTableModel( this ) ); } private JButton getExtreemesButton() { if ( extreemesButton == null ) { extreemesButton = new JButton(); extreemesButton.setText( new Message( Messages.EXTREMES ).toString() ); extreemesButton.setFont( GUIConstants.DIALOG_12 ); extreemesButton.setIcon( new ImageIcon( getClass().getClassLoader().getResource( "info/puzz/trackprofiler/icons/minimum.gif" ) ) ); //$NON-NLS-1$ extreemesButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { try { extreemesButtonActionPerformed( evt ); } catch ( TrackProfilerException e ) { TrackProfilerFrame.this.showError( new Message( e.getMessage() ) ); } } } ); } return extreemesButton; } private void extreemesButtonActionPerformed( ActionEvent evt ) throws TrackProfilerException { if ( this.track == null ) { throw new TrackProfilerException( "track_not_loaded" ); //$NON-NLS-1$ } this.showExtreemes = !this.showExtreemes; this.drawChart(); } private JLabel getHiPointLabel() { if ( hiPointLabel == null ) { hiPointLabel = new JLabel(); hiPointLabel.setText( new Message( Messages.HIGHEST_POINT ).toString() ); hiPointLabel.setBounds(20, 55, 80, 20); hiPointLabel.setFont( GUIConstants.DIALOG_10 ); hiPointLabel.setHorizontalAlignment( SwingConstants.RIGHT ); } return hiPointLabel; } private JTextField getHiPointField() { if ( hiPointField == null ) { hiPointField = new JTextField(); hiPointField.setBounds(100, 55, 70, 20); hiPointField.setEditable( false ); } return hiPointField; } private JLabel getLowPointLabel() { if ( lowPointLabel == null ) { lowPointLabel = new JLabel(); lowPointLabel.setText( new Message( Messages.LOWEST_POINT ).toString() ); //$NON-NLS-1$ lowPointLabel.setFont( GUIConstants.DIALOG_10 ); lowPointLabel.setBounds( 10, 30, 90, 20 ); lowPointLabel.setHorizontalAlignment( SwingConstants.RIGHT ); } return lowPointLabel; } private JTextField getLowPointField() { if ( lowPointField == null ) { lowPointField = new JTextField(); lowPointField.setBounds( 100, 30, 70, 20 ); lowPointField.setEditable( false ); } return lowPointField; } private JLabel getClimbingSumLabel() { if ( climbingSumLabel == null ) { climbingSumLabel = new JLabel(); climbingSumLabel.setText( new Message( Messages.UPHILL_SUM ).toString() ); climbingSumLabel.setFont( GUIConstants.DIALOG_10 ); climbingSumLabel.setBounds(10, 80, 90, 20); climbingSumLabel.setHorizontalAlignment( SwingConstants.RIGHT ); } return climbingSumLabel; } private JLabel getDownhillSumLabel() { if ( downhillSumLabel == null ) { downhillSumLabel = new JLabel(); downhillSumLabel.setText( new Message( Messages.DOWNHILL_SUM ).toString() ); downhillSumLabel.setFont( GUIConstants.DIALOG_10 ); downhillSumLabel.setBounds(0, 105, 100, 20); downhillSumLabel.setHorizontalAlignment( SwingConstants.RIGHT ); } return downhillSumLabel; } private JLabel getLength2dLabel() { if ( length2dLabel == null ) { length2dLabel = new JLabel(); length2dLabel.setText( new Message( Messages._2D_LENGTH ).toString() ); length2dLabel.setFont( GUIConstants.DIALOG_10 ); length2dLabel.setBounds(30, 130, 70, 20); length2dLabel.setHorizontalAlignment( SwingConstants.RIGHT ); } return length2dLabel; } private JLabel getLength3dLabel() { if ( length3dLabel == null ) { length3dLabel = new JLabel(); length3dLabel.setText( new Message( Messages._3D_LENGTH ).toString() ); length3dLabel.setFont( GUIConstants.DIALOG_10 ); length3dLabel.setBounds(10, 155, 90, 20); length3dLabel.setHorizontalAlignment( SwingConstants.RIGHT ); } return length3dLabel; } private JTextField getClimbingSumField() { if ( climbingSumField == null ) { climbingSumField = new JTextField(); climbingSumField.setBounds(100, 80, 70, 20); climbingSumField.setEditable( false ); } return climbingSumField; } private JTextField getDownhillField() { if ( downhillField == null ) { downhillField = new JTextField(); downhillField.setBounds(100, 105, 70, 20); downhillField.setEditable( false ); } return downhillField; } private JTextField getLength3DField() { if ( length3DField == null ) { length3DField = new JTextField(); length3DField.setBounds(100, 155, 70, 20); length3DField.setEditable( false ); } return length3DField; } private JTextField getLength2DField() { if ( length2DField == null ) { length2DField = new JTextField(); length2DField.setBounds(100, 130, 70, 20); length2DField.setEditable( false ); } return length2DField; } private JButton getExitButton() { if ( exitButton == null ) { exitButton = new JButton(); exitButton.setText( new Message( Messages.EXIT ).toString() ); exitButton.setIcon(new ImageIcon(getClass().getClassLoader().getResource("info/puzz/trackprofiler/icons/delete_edit.gif"))); //$NON-NLS-1$ exitButton.setFont( GUIConstants.DIALOG_12 ); exitButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { exitButtonActionPerformed( evt ); } } ); } return exitButton; } private JPanel getJPanel3() { if ( jPanel3 == null ) { jPanel3 = new JPanel(); jPanel3.setBorder( BorderFactory.createTitledBorder( new Message( Messages.TRACK_DETAILS ).toString() ) ); jPanel3.setLayout( null ); jPanel3.setPreferredSize(new java.awt.Dimension(180, 185)); jPanel3.add( getClimbingSumLabel() ); jPanel3.add( getHiPointField() ); jPanel3.add( getLowPointLabel() ); jPanel3.add( getLowPointField() ); jPanel3.add( getDownhillSumLabel() ); jPanel3.add( getLength2dLabel() ); jPanel3.add( getLength3dLabel() ); jPanel3.add( getClimbingSumField() ); jPanel3.add( getDownhillField() ); jPanel3.add( getLength3DField() ); jPanel3.add( getLength2DField() ); jPanel3.add( getHiPointLabel() ); } return jPanel3; } private void exitButtonActionPerformed( ActionEvent evt ) { this.close(); } private void rootWindowClosing( WindowEvent evt ) { this.close(); } private void close() { this.setVisible( false ); System.exit( 1 ); } private JButton getPreferencesButton() { if ( preferencesButton == null ) { preferencesButton = new JButton(); preferencesButton.setText( new Message( Messages.PREFERENCES ).toString() ); preferencesButton.setIcon( new ImageIcon( getClass().getClassLoader().getResource( "info/puzz/trackprofiler/icons/ok_st_obj.gif" ) ) ); //$NON-NLS-1$ preferencesButton.setFont( GUIConstants.DIALOG_12 ); preferencesButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { propertiesButtonActionPerformed( evt ); } } ); } return preferencesButton; } private void propertiesButtonActionPerformed( ActionEvent evt ) { TrackProfilerPreferencesDialog trackProfilerPropertiesDialog = new TrackProfilerPreferencesDialog( this ); trackProfilerPropertiesDialog.setModal( true ); trackProfilerPropertiesDialog.setVisible( true ); } private JButton getWaypointsButton() { if ( waypointsButton == null ) { waypointsButton = new JButton(); waypointsButton.setText( new Message( Messages.WAYPOINTS ).toString() ); waypointsButton.setFont( GUIConstants.DIALOG_12 ); waypointsButton.setIcon( new ImageIcon( getClass().getClassLoader().getResource( "info/puzz/trackprofiler/icons/brkpi_obj.gif" ) ) ); //$NON-NLS-1$ waypointsButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { waypointsButtonActionPerformed( evt ); } } ); } return waypointsButton; } private void waypointsButtonActionPerformed( ActionEvent evt ) { if ( this.track == null ) { this.showError( new Message( Messages.TRACK_NOT_LOADED ) ); return; } WaypointsTable table = new WaypointsTable(); table.setVisible( true ); } private void showError( Message message ) { JOptionPane.showMessageDialog( this, message.getLocalizedMessage(), new Message( Messages.ERROR ).toString(), JOptionPane.WARNING_MESSAGE ); } private JScrollPane getJScrollPane1() { if (jScrollPane1 == null) { jScrollPane1 = new JScrollPane(); jScrollPane1.setBorder( BorderFactory.createTitledBorder( Message.get( Messages.TRACK_POINTS ) ) ); jScrollPane1.setPreferredSize(new java.awt.Dimension(180, 260)); jScrollPane1.setViewportView(getTrackTable()); } return jScrollPane1; } private JTable getTrackTable() { if (trackTable == null) { trackTable = new JTable(); trackTable.setModel(new TrackTableModel(this)); trackTable.addMouseListener(new MouseAdapter() { public void mouseReleased( MouseEvent evt ) { TrackProfilerFrame.this.setSelectedPoint(); } // public void mouseClicked(MouseEvent evt) { // TrackProfilerFrame.this.setSelectedPoint(); // } }); trackTable.addKeyListener(new KeyAdapter() { public void keyReleased(KeyEvent evt) { TrackProfilerFrame.this.setSelectedPoint(); } }); } return trackTable; } /** Posebno oznacava tocku na track-u koja je oznacena u tablici. */ private void setSelectedPoint() { int[] _selectedPoints = this.getTrackTable().getSelectedRows(); if( _selectedPoints == null || _selectedPoints.length == 0 ) { this.startSelectedPoints = -1; this.endSelectedPoints = -1; } else { // Trazimo prvu i zadnju tocku: int _start = _selectedPoints[0]; int _end = _selectedPoints[_selectedPoints.length - 1]; if( _start == this.startSelectedPoints && _end == this.endSelectedPoints && _start == _end ) { // Ako je odabrana samo jedna tocka - i to ona koja je otprije odabrana => micemo odabir this.startSelectedPoints = -1; this.endSelectedPoints = -1; } else { this.startSelectedPoints = _start; this.endSelectedPoints = _end; } } // Ako su tocke iste kao i stare => necemo prikazati na tablici: try { this.drawChart(); } catch ( TrackProfilerException e ) { this.showError( new Message( e.getMessage() ) ); } } /** Vraca Dataset za crtanje grafa od trenutnog track-a. */ public AbstractXYDataset toDataset() { XYSeries xyseries = new XYSeries( new Message( Messages.TRACK_PROFILE ).toString() ); //$NON-NLS-1$ double ukupno = 0D; for ( int i = 1; i < this.getTrack().size(); i++ ) { TrackPoint t1 = this.getTrack().getPointAt( i - 1 ); TrackPoint t2 = this.getTrack().getPointAt( i ); // System.out.println( "Udaljenost:" + t1.distance( t2 ) ); ukupno = ukupno + t1.distance2D( t2 ); // Ne crta tocku ako je izmedju dvije posebno oznacene: if ( i > this.startSelectedPoints && i < this.endSelectedPoints ) { continue; } xyseries.add( ukupno, t1.getElevation() ); } return new XYSeriesCollection( xyseries ); } private JButton getAboutButton() { if ( aboutButton == null ) { aboutButton = new JButton(); aboutButton.setFont( GUIConstants.DIALOG_12 ); aboutButton.setIcon( new ImageIcon( getClass().getClassLoader().getResource( "info/puzz/trackprofiler/icons/help_contents.gif" ) ) ); //$NON-NLS-1$ aboutButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent evt ) { aboutButtonActionPerformed( evt ); } } ); aboutButton.setText( Message.get( Messages.ABOUT ) ); } return aboutButton; } private void aboutButtonActionPerformed( ActionEvent evt ) { JOptionPane.showMessageDialog( this, Message.get( Messages.COPYRIGHT, TrackProfilerAppContext.PROGRAM_VERSION ), Message.get( Messages.ABOUT ), JOptionPane.INFORMATION_MESSAGE ); } }